package com.crm.set.service;

import com.crm.common.mapper.UserMapper;
import com.crm.common.pojo.User;
import com.crm.global.exception.CrmException;
import com.crm.global.exception.ExceptionEnum;
import com.crm.id.increment.IdWorker;
import com.crm.mybatis.separation.Read;
import com.crm.mybatis.separation.Write;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 查询所有用户(带分页)
     * @param page 页码
     * @param size 页面展示数据条数
     * @return 满足条件的 User
     */
    @Read
    public PageInfo<User> listAll(int page, int size) {
        // 分页代码
        PageHelper.startPage(page,size);

        // 查询
        List<User> users = userMapper.selectAll();

        // 将查询出来的结果进行封装
        return new PageInfo<>(users);
    }

    /**
     * 保存或者更新
     *      如果 id为空代表插入
     *      如果 id不为空代表更新
     * @param user 用户信息
     */
    @Write
    public void saveOrUpdate(User user) {
        if (user == null) {
            throw new CrmException(ExceptionEnum.PARAM_IS_NULL);
        }
        if (user.getId() != null) {
            userMapper.updateByPrimaryKey(user);
        } else {
            user.setId(new IdWorker().nextId());
            userMapper.insert(user);
        }

    }

    /**
     * 根据用户id删除数据
     * @param id 用户id
     */
    @Write
    public void delete(long id) {
        userMapper.deleteByPrimaryKey(id);
    }


    /**
     * 根据用户名密码查询用户
     * @param username 用户名
     * @param password  密码
     * @return 用户
     */
    @Read
    public User selectByUsernameAndPassword(String username,String password) {
        if(StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
            throw new CrmException(ExceptionEnum.PARAM_IS_NULL);
        }

        Example example = new Example(User.class);
        example.createCriteria().andEqualTo("username",username)
                .andEqualTo("password",password);
        List<User> list = userMapper.selectByExample(example);

        return list == null ? null : list.size() > 0 ? list.get(0) : null;
    }
}
